package com.java.basis.io.file;

import org.junit.Test;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author wangning
 * @create 2021-05-07 11:26
 */
public class TestFile01 {
	@Test
	public void testFile() throws MalformedURLException {
		File file = new File("F:\\jt\\file\\aaa.txt");
		System.out.println("file.toString() = " + file.toString());
		System.out.println("file.exists() = " + file.exists());
		System.out.println("file.getAbsolutePath() = " + file.getAbsolutePath());
		System.out.println("file.getPath() = " + file.getPath());
		System.out.println("file.getAbsoluteFile() = " + file.getAbsoluteFile());
		System.out.println("file.getParent() = " + file.getParent());
		System.out.println("file.getName() = " + file.getName());
		/*
		getFreeSpace
		这个是文件所在的磁盘分区，剩余的存储空间（不一定就是可以用的存储空间，剩余存储空间就是，磁盘的总空间减去已经使用存储空间）
		getUsableSpace
		这个是文件所在的磁盘分区，真正可以使用的存储空间
		getTotalSpace
		这个文件所在磁盘分区总共能存储的空间
		 */
		System.out.println("file.getTotalSpace() = " + file.getTotalSpace() / 1024 / 1024 / 1024 + "G");//当前分区总字节数
		System.out.println("getFreeSpace() = " + file.getFreeSpace() / 1024 / 1024 / 1024 + "G");//剩余字节数
		System.out.println("getUsableSpace() = " + file.getUsableSpace() / 1024 / 1024 / 1024 + "G");//可用空间

		/*
		toURL()此方法不会自动转义URL中非法的字符。 建议在新的代码转换的抽象路径到URL通过先转换成URI，经由toURI方法，
		然后经由转换URI为URL URI.toURL方法。
		 */
		System.out.println("file.toURI() = " + file.toURI());
		URL url = file.toURI().toURL();
		System.out.println("url = " + url);
		System.out.println("file.toPath() = " + file.toPath());

		System.out.println("----------------------------");
		System.out.println("isAbsolute() = " + file.isAbsolute());
		System.out.println("isDirectory() = " + file.isDirectory());
		System.out.println("isFile() = " + file.isFile());
		System.out.println("isHidden() = " + file.isHidden());
		System.out.println("lastModified() = " + file.lastModified());
		long time = file.lastModified();
		Date date = new Date(time);
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
		String format = simpleDateFormat.format(date);
		System.out.println("format = " + format);

		System.out.println("length() = " + file.length());


	}

	/**
	 * renameTo方法重命名文件
	 */
	@Test
	public void testRenameTo() {
		// Old file
		File oldFile = new File("F:\\jt\\file\\bbb.txt");
		// new file
		File newFile = new File("F:\\jt\\file\\aaa.txt");
		/* renameTo() return boolean value
		It return true if rename operation is successful
		 */
		boolean flag = oldFile.renameTo(newFile);
		if (flag) {
			System.out.println("File renamed successfully");
		} else {
			System.out.println("Rename operation failed");
		}
	}

	/**
	 * 计算文件夹总大小
	 * *)对参数dir文件夹列表，存到files
	 * *)如果files是null，返回0
	 **)定义累加变量sum = 0L
	 * *)遍历files数组，取出文件存到f
	 * *)如果f是文件
	 * *)向sum累加f文件的大小
	 * *)否则
	 * *)向sum累加f文件夹的大小(递归求出)
	 * *)循环结束，返回sum的值
	 *
	 */
	@Test
	public void calculateDirLength() {
		File file = new File("F:\\jt");
		if (file.isDirectory()) {
			long dirLength = dirLength(file);
			System.out.println("dirLength = " + dirLength / 1024 / 1024);

		}
	}

	private long dirLength(File file) {
		File[] files = file.listFiles();
		if (files == null) {
			return 0;
		}
		long sum = 0;
		for (File f : files) {
			if (f.isFile()) {
				sum += f.length();
			} else {
				sum += dirLength(f);
			}
		}
		return sum;
	}




}
